home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / stuconfg.c < prev    next >
C/C++ Source or Header  |  1996-05-27  |  47KB  |  1,907 lines

  1. /*
  2.  * StuConfig.c
  3.  *
  4.  * Purpose:
  5.  * --------
  6.  * Routines de traitement de la configuration globale du programme
  7.  *
  8.  * History:
  9.  * --------
  10.  * 1993: fplanque: Created
  11.  */
  12.  
  13.  
  14.      #include "!OPTIONS.H"                /* Options de compilation */         
  15.     #define    THIS_FILE    "STUCONFG.C v1.00 - 03.95"
  16.           
  17.  
  18. /*
  19.  * System headers:
  20.  */
  21.     #include    <stdio.h>
  22.     #include    <stdlib.h>                    /* Malloc... */
  23.     #include    <string.h>                    /* strcpy() etc.. */
  24.     #include    <aes.h>                        /* header AES */
  25.    
  26.  
  27. /*
  28.  * Custom headers:
  29.  */
  30.     #include    "SPEC_PU.H"
  31.     #include "S_MALLOC.H"
  32.     #include    "WIN_PU.H"
  33.     #include "STUT_ONE.RSC\STUT_3.H"                        /* noms des objets ds le ressource */
  34.     #include    "POPUP_PU.H"                    /* Menus pop-up */
  35.     #include "SERV_PU.H"                    /* En ce qui concerne les voies */
  36.     #include    "DEBUG_PU.H"    
  37.     #include    "SRIAL_PU.H"    
  38.     #include    "RAMSL_PU.H"    
  39.     #include    "MAIN_PU.H"    
  40.     #include    "FILES_PU.H"    
  41.     #include    "RTERR_PU.H"    
  42.  
  43.  
  44.  
  45.  
  46.  
  47. /*
  48.  * ------------------------ PROTOTYPES -------------------------
  49.  */
  50.  
  51. /*
  52.  * EXTernal prototypes:
  53.  */
  54.     /*
  55.      * Traitement des objets AES: 
  56.      */
  57.     extern    void    rsrc_color( OBJECT *tree );
  58.     extern    void    objc_fixsel( 
  59.                             OBJECT*    pObj_tree,     /* In: Arbre dans lequel on agit */
  60.                             int         n_obj,        /* In: Objet sur lequel on agit */
  61.                             int        n_state );    /* In: 0=d‚selection, autre selectionne */
  62.     extern    BOOL    objc_testsel(                 /* Out: !=0 si s‚lectionn‚ */
  63.                             OBJECT *    pObj_tree,     /* In: Arbre dans lequel on teste */
  64.                             int         n_obj );        /* In: Objet sur lequel on teste */
  65.     extern    void    objc_setdisable( OBJECT *tree, int obj );
  66.     extern    void    objc_setenable( OBJECT *tree, int obj );
  67.     extern    void    objc_enable( OBJECT *tree, int obj );
  68.     extern    void    objc_disable( OBJECT *tree, int obj );
  69.     extern    void    open_dialog( OBJECT *dialog, const GRECT *little_box, GRECT *big_box );
  70.     extern    void    close_dialog( OBJECT *dialog, int exit_obj, const GRECT *little_box, const GRECT *big_box );
  71.     extern    void    deselect_current( void );
  72.     extern    void    dlink_teptext( OBJECT *objc_adr, const char *texte );
  73.     extern    void    objc_clrsel( OBJECT *tree, int obj );
  74.     extern    GRECT* objc_xywh ( 
  75.                                 OBJECT *tree, 
  76.                                 int objc, 
  77.                                 GRECT *frame );
  78.  
  79.     /* 
  80.      * Form_do: 
  81.      */
  82.     extern    int    ext_form_do( OBJECT *tree, int *startfield );
  83.     /* 
  84.      * Donn‚es: 
  85.      */
  86.     extern    void    group_directload( DATAGROUP *curr_datagroup, int file_type, char *file_access );
  87.     extern    SSTATE    get_ServSState( void );     /* Out: SSTATE global...*/
  88.     /*
  89.      * Desktop:
  90.      */
  91.     extern    DATAGROUP    *    find_datagroup_byType(         /* Out: Ptr sur datagroup */
  92.                                         DATATYPE        DataType );    /* In:  Type DTYP_* */
  93.  
  94.     /* 
  95.      * Menus Pop-Up:
  96.      */
  97.     extern    void    fix_popup_title( 
  98.                             OBJECT    *popup_title,     /* In: Objet titre de Menu */
  99.                             POPUP_ENTRY *entries,     /* In: Menu Pop-Up associ‚ */
  100.                             int current_val );        /* In: Valeur … assigner au titre */
  101.     extern    int    popup_inform(                     /* Out: Valeur s‚lectionn‚e */
  102.                             OBJECT *call_form,         /* In:  Formulaire appellant */
  103.                             int call_obj,                 /* In:  Objet appellant */
  104.                             int title_obj,             /* In:  No Objet sur lequel le menu va s'aligner (Titre de menu) */
  105.                             POPUP_ENTRY *entries,     /* In:  Menu Pop-Up … d‚rouler */
  106.                             int current_val );        /* In:  Valeur courante -> recevra checkmark */
  107.  
  108.  
  109. /*
  110.  * PRIVate INTernal prototypes:
  111.  */
  112.     static char    *cree_ligne_voie( VOIE *curr_voie );
  113.     static int    affecte_actions( LISTHANDLES *list_handles, int    obj );
  114.     static void    affec_fixstate_act(                     /* Out: Rien */
  115.                         LISTHANDLES *list_handles );    /* In: Ptr sur infos sur la liste & le dialogue affich‚s */
  116.     static void    Affecte_ParamsVoie( 
  117.                         LISTHANDLES *list_handles,     /* In: Infos sur liste de voies */
  118.                         OBJECT *arbre_fond,                 /* In: Formulaire appellant */
  119.                         int call_obj );                    /* In: Objet appellant ds ce formulaire */
  120.     static VOIE* find_ParamsVoie_byOrdNo(            /* Out: Ptr sur params voie cherch‚e */
  121.                         VOIE *pVoie_Liste,                 /* In:  Ptr sur premiŠre voie ds liste */
  122.                         int ord );                            /* In:  No d'ordre de la voie cherch‚e */
  123.     static void    ajoute_voie( LISTHANDLES *list_handles );
  124.     static void    supprime_voie(                         /* Out: Rien */
  125.             LISTHANDLES *list_handles );                /* In/Out: ParamŠtres de la liste de s‚lection */
  126.  
  127.  
  128.  
  129. /*
  130.  * ------------------------ VARIABLES -------------------------
  131.  */
  132.     
  133. /*
  134.  * External variables: 
  135.  */
  136.     /* 
  137.      * G‚n‚ral: 
  138.      */
  139.     extern    char    *G_empty_string;        /* Chaine vide */
  140.     extern    char    *G_tmp_buffer;            /* Peut contenir un texte long de 255 signes + '\0' */
  141.     extern    void    *G_null;                    /* Pointeur null */
  142.     extern    char    *G_crlf;                    /* Retour … la ligne */
  143.     /* 
  144.      * Vdi: 
  145.      */
  146.     extern    USERBLK    G_bcroix_ublk;        /* Pour bouton-croix */
  147.     /* 
  148.      * Datas: 
  149.      */
  150.     extern    DATAGROUP    *G_datagroups;    /* Pointeur sur tableau de G_datagroups */
  151.     /* 
  152.      * Ic“nes: 
  153.      */
  154.     extern    WIPARAMS        *G_desk_params_adr;    /* ParamŠtres de la "fenˆtre bureau" */
  155.     /* 
  156.      * Fichiers: 
  157.      */
  158.     extern    char    G_stutpath[];    /* Path dans lequel se trouve Stut One */
  159.     extern    char    G_filename[];    /* Nom du fichier … charger ex:TEST.TXT */
  160.     extern    char    G_filepath[];    /* Chemin du fichier … charger ex:D\EXEMPLE */
  161.     /* 
  162.      * Serveur: 
  163.      */
  164.     extern    VOIE    *G_voies;                        /* Liste des voies */
  165.     extern    int    G_nb_voies;                        /* Nombre de voies */
  166.     extern    char    *G_mode[];                        /* Modes de fonctionnement */
  167.     extern    long    G_abrev_mode[];                /* Abreviations modes */
  168.     extern    POPUP_ENTRY    G_Popup_Modes[];        /* Menu Pop-Up s‚lection Mode */
  169.     /* 
  170.      * Ports s‚rie: 
  171.      */
  172.     extern    int    G_term_dev;                        /* Port utilis‚ par icone terminal ( Sur un STF sans Bconmap: 1,AUX ) */
  173.     extern    POPUP_ENTRY    *G_inst_drv_list;        /* Liste des p‚rifs install‚s pourmenu Popup */
  174.     extern    long    *G_inst_abrev;                    /* Abr‚viations p‚rifs install‚s */
  175.  
  176.  
  177. /*
  178.  * Public variables: 
  179.  */
  180.     /* 
  181.      * Type: 
  182.      */
  183.     int    G_cnf_gest_form_std = FALSE0;    /* Gestion de formulaires Standard */
  184.     int    G_cnf_cope_with_ltf = FALSE0;    /* Contourner les bugs de Let'em Fly */
  185.  
  186.     
  187. /*
  188.  * Private variables: 
  189.  */
  190.      /*
  191.       * Ptrs sur boŒtes de dialogue:
  192.       */
  193.     static OBJECT    *M_compatib_adr;        /* Boite de config compatibilit‚ */
  194.     static OBJECT    *M_affect_adr;            /* Boite d'affectation des voies */
  195.     static OBJECT    *M_pForm_ParamsVoie;    /* Formulaire de config d'une voie */
  196.     /* 
  197.      * Param des voies: 
  198.      */
  199.     static VOIE                *M_voies_copies;
  200.      
  201.  
  202. /*
  203.  * ------------------------ FUNCTIONS -------------------------
  204.  */
  205.  
  206. /*
  207.  * init_config(-)
  208.  *
  209.  * Purpose:
  210.  * --------
  211.  * Init des variables et des boŒtes de configuration
  212.  * utilis‚es ds ce module
  213.  *
  214.  * History:
  215.  * --------
  216.  * 1993: fplanque: Created
  217.  */
  218. void    init_config( void )
  219. {
  220.     /* 
  221.      * Init RSC: 
  222.      */
  223.     if ( rsrc_gaddr( R_TREE, COMPATIB, &M_compatib_adr ) == 0 )
  224.         erreur_rsrc();
  225.     rsrc_color( M_compatib_adr );        /* Fixe couleurs */
  226.  
  227.     if ( rsrc_gaddr( R_TREE, AFFECT, &M_affect_adr ) == 0 )
  228.         erreur_rsrc();
  229.     rsrc_color( M_affect_adr );        /* Fixe couleurs */
  230.  
  231.     if ( rsrc_gaddr( R_TREE, PARAVOIE, &M_pForm_ParamsVoie ) == 0 )
  232.         erreur_rsrc();
  233.     rsrc_color( M_pForm_ParamsVoie );    /* Fixe couleurs */
  234. }
  235.  
  236.  
  237. /*
  238.  * set_compat(-)
  239.  *
  240.  * Purpose:
  241.  * --------
  242.  * R‚glage des paramŠtres de compatibilit‚ de STUT ONE 
  243.  * avec son environnement:
  244.  * - Gestion des formulaires par le Form_Do std plut“t que Ex_form_do
  245.  * - Coutourner les bugs de Let'Em Fly
  246.  *
  247.  * History:
  248.  * --------
  249.  * 1993: fplanque: Created
  250.  */
  251. void set_compat( const GRECT *start_box )
  252. {
  253.     int        exit_obj;                    /* Objet de sortie */
  254.     GRECT        form_box;                    /* Dimensions du formulaire */
  255.     int        edit = 0;                    /* Bidon */
  256.  
  257.     /* 
  258.      * Fixe flags des boutons: 
  259.      */
  260.     objc_fixsel( M_compatib_adr, GFORMSTD, G_cnf_gest_form_std );
  261.     objc_fixsel( M_compatib_adr, TESTCOMP, G_cnf_cope_with_ltf );
  262.  
  263.     /* 
  264.      * Gestion boŒte: 
  265.      */
  266.     /* App prend en charge souris */
  267.     WIND_UPDATE_BEG_MCTRL
  268.     
  269.     open_dialog( M_compatib_adr, start_box, &form_box );
  270.     
  271.     exit_obj=ext_form_do( M_compatib_adr, &edit);    /* Gestion de la boŒte */
  272.  
  273.     close_dialog( M_compatib_adr, exit_obj, start_box, &form_box );
  274.  
  275.     /* AES peut reprendre la souris */
  276.     WIND_UPDATE_END_MCTRL
  277.  
  278.     /*
  279.      * Teste s'il y a eu confirmation: 
  280.      */
  281.     if ( exit_obj == COMPVALI )
  282.     {    /* 
  283.          * R‚cupŠre ‚tat des boutons: 
  284.          */
  285.         G_cnf_gest_form_std = objc_testsel( M_compatib_adr, GFORMSTD );
  286.         G_cnf_cope_with_ltf = objc_testsel( M_compatib_adr, TESTCOMP );
  287.     }
  288. }
  289.  
  290.  
  291.  
  292. /*
  293.  * ------------------- TRAITEMENT FICHIER .INI --------------------
  294.  */
  295.  
  296.  
  297. /*
  298.  * sauver_config_ini(-)
  299.  *
  300.  * Purpose:
  301.  * --------
  302.  * AprŠs s‚lection menu:
  303.  * Traite Demande de Sauvegarde configuration dans fichier .INI
  304.  *
  305.  * Algorythm:
  306.  * ----------  
  307.  * Demande conf
  308.  * Cr‚e nom du fichier .INI
  309.  * Appele 'sauve()' -> save_inidata
  310.  *
  311.  * History:
  312.  * --------
  313.  * 1993: fplanque: Created
  314.  * 03.01.94: fplanque: Chang‚ texte de demande de conf
  315.  */
  316. void    sauver_config_ini( void )
  317. {
  318.     /* 
  319.      * Demande de confirmation: 
  320.      */
  321.         int confirm = form_alert(2,
  322.                             "[2][Voulez-vous sauver la|"
  323.                                 "configuration actuelle de|"
  324.                                 "maniŠre … ce qu'elle soit|"
  325.                                 "recharg‚e automatiquement|"
  326.                                 "la prochaine fois?]"
  327.                                 "[Sauver|Annuler]");
  328.  
  329.     /* 
  330.      * Selon r‚ponse utilisateur: 
  331.      */
  332.         if ( confirm == 1 )
  333.         {    /* 
  334.              * Si on a confirm‚: 
  335.              */
  336.             strcpy( G_filepath, G_stutpath );        /* Dans le dossier STUT ONE */
  337.             strcpy( G_filename, "STUT_000.INI" );    /* Nom du Fichier … sauver */
  338.             /*    printf("Path=%s  Name=%s \n",  G_filepath, G_filename ); */
  339.  
  340.             directsave_file( FS_INI, NULL );            /* Sauve la configuration actuelle dans ce fichier */
  341.  
  342.         }
  343. }
  344.  
  345.  
  346. /*
  347.  * save_inidata(-)
  348.  *
  349.  * Purpose:
  350.  * --------
  351.  * Sauvegarde point par point des donn‚es dans les fichier .INI
  352.  *
  353.  * Algorythm:
  354.  * ----------  
  355.  * Sauve:
  356.  * -Conf ports s‚rie
  357.  * -Affectation des voies
  358.  *
  359.  * Notes:
  360.  * ------
  361.  * 
  362.  * Suggest:
  363.  * --------
  364.  * - Faire une fonc ind‚pendante pour l'affectation des voies
  365.  * - Inclure les paramŠtres de compatibilit‚
  366.  *
  367.  * History:
  368.  * --------
  369.  * 1993: fplanque: Created
  370.  */
  371. void    save_inidata( FILE *fstream )
  372. {
  373.     /* 
  374.      * Sauve configuration des ports s‚rie:
  375.      */
  376.     save_serial_ini( fstream );
  377.  
  378.     /*
  379.      * Sauve affectation des voies:
  380.      */
  381.     {
  382.         VOIE    *curr_voie;        /* Voie en cours de traitement */
  383.         int     dev_offset;        /* Device offset du port affect‚ … une voie */
  384.  
  385.     
  386.         /*
  387.          * Signale qu'on s'int‚resse ici … l'affectation des voies: 
  388.          */
  389.         fputs( "\r\n[ Affectation des voies: ]\r\n\r\n", fstream );        /* Commentaire */
  390.  
  391.         /*
  392.          * Parcourt les ports: 
  393.          */
  394.         curr_voie = G_voies;
  395.         while( curr_voie != NULL )
  396.         {
  397.             /*
  398.              * Offset: 
  399.              */
  400.             /* TRACE2( "Voie %d; device %d", curr_voie -> no_voie, curr_voie -> device ); */
  401.             dev_offset = device_offset( curr_voie -> device );
  402.             
  403.             /*
  404.              * Sauve no voie: 
  405.              */
  406.             fprintf( fstream, "VOIE %03d:", curr_voie -> no_voie );
  407.             
  408.             /*
  409.              * Sauve port affect‚: 
  410.              */
  411.             fwrite( &G_inst_abrev[ dev_offset ], sizeof( long ), 1, fstream  );
  412.             fputc( ',', fstream );
  413.  
  414.             /*
  415.              * Sauve mode: 
  416.              */
  417.             fwrite( &G_abrev_mode[ curr_voie -> mode ], sizeof( long ), 1, fstream );
  418.  
  419.             fprintf( fstream, G_crlf );
  420.                             
  421.             /*
  422.              * Passe … la voie suivante: 
  423.              */
  424.             curr_voie = curr_voie -> next;
  425.         }
  426.     }
  427. }
  428.  
  429.  
  430. /*
  431.  * autoload_ini(-)
  432.  *
  433.  * Purpose:
  434.  * --------
  435.  * Chargement automatique de la configuration dans STUT_ver.INI
  436.  * lors du lancement de STUT ONE
  437.  *
  438.  * Algorythm:
  439.  * ----------  
  440.  * -Cr‚e path fichier ds dir de lancement 
  441.  * -Appele 'load()' -> load_ini()
  442.  *
  443.  * History:
  444.  * --------
  445.  * 1993: fplanque: Created
  446.  */
  447. void    autoload_ini( void )
  448. {
  449.     /*
  450.      * Variables: 
  451.      */
  452.     FTA    fta;        /* File Transfer Area */
  453.  
  454.     /* 
  455.      * Fixe le chemin d'accŠs et le nom du fichier: 
  456.      */
  457.     strcpy( G_filepath, G_stutpath );    /* Dans le dossier STUT ONE */
  458.     strcpy( G_filename, "STUT_000.INI" );    /* Nom du Fichier … charger */
  459.         
  460.     /*
  461.      * Charge fichier STUT_ver.INI 
  462.      */
  463.     directload_file2( FS_INI, &fta, NO0 );        /* Charge slt si le fichier existe */
  464. }
  465.  
  466.  
  467. /*
  468.  * load_ini(-)
  469.  *
  470.  * Purpose:
  471.  * --------
  472.  * Chargement des donn‚es pt par pt depuis le fichier .INI:
  473.  *
  474.  * History:
  475.  * --------
  476.  * 1993: fplanque: Created
  477.  */
  478. void    load_ini( FILE *fstream )
  479. {
  480.     char    *    instr;            /* Instruction … traiter */
  481.     char    *    object;            /* Donn‚e … modifier */
  482.     char    *    data;                /* Contenu … charger */
  483.     char    *    separat;            /* S‚parateur de paramŠtres: */
  484.         /* ATTENTION, ces variables vont en fait pointer dans G_xxx_buffer, ne pas faire de free */
  485.  
  486.     VOIE    *    voies;            /* (Nouvelle) liste des voies */
  487.     VOIE    **    last_ptr_to_next = &voies;
  488.     VOIE    *    curr_voie;        /* Voie en cours de cr‚ation: */
  489.     int        device;            /* P‚riph concern‚ */
  490.     long        abrev_mode;        /* Abrev mode de fonctonnement... */
  491.     int        mode;                /* Mode de fonctionnement de la voie courante */
  492.     int        nb_voies = 0;    /* Nbre de voies charg‚es */
  493.  
  494.  
  495.     /* 
  496.      * Contr“le le header:
  497.      */
  498.     int n_Version = head_control( fstream, FS_INI, "Configuration" );
  499.     
  500.     /*
  501.      * Contr“le le no de version:
  502.      */
  503.     switch( n_Version )
  504.     {
  505.         case    0x0000:
  506.             break;
  507.             
  508.         case    ERROR_1:
  509.             /*
  510.              * Chargement … ‚chou‚ dans le header:
  511.              */
  512.             return;
  513.  
  514.         default:
  515.             /*
  516.              * Chargement … ‚chou‚ 
  517.              */
  518.             alert( BAD_VERSION );
  519.             return;
  520.     }
  521.  
  522.     /*
  523.      * Si le header est correct: 
  524.      * Boucle de chargement: 
  525.      */
  526.     while( !feof( fstream ) )
  527.     {    /*
  528.          * Tant qu'on est pas … la fin du fichier: 
  529.          * Charge une instruction: 
  530.          */
  531.         instr = get_config_line( fstream, ':', &object, &data );
  532.  
  533.         /*
  534.          * Test de l'instruction … traiter: 
  535.          */
  536.         if ( instr != NULL )
  537.         {    /*
  538.              * S'il y a une instruction: 
  539.              */
  540.             if ( strcmp( instr, "PORT" ) == 0 )
  541.             {    /*
  542.                   * ---------------------- 
  543.                  * Fixe paramŠtres s‚rie: 
  544.                  * ---------------------- 
  545.                  */
  546.                 serial_ini( object, data );
  547.             }
  548.             else if ( strcmp( instr, "VOIE" ) == 0 )
  549.             {    /*
  550.                  * -----------------------------
  551.                  * Fixe l'affectation des voies:
  552.                  * ----------------------------- 
  553.                  */
  554.                 /*    printf("obj=%s dat=%s\n", object, data );     */
  555.  
  556.                 /*
  557.                  * Recherche virgule: 
  558.                  */
  559.                 separat = strchr( data, ',' );
  560.  
  561.                 if ( object == NULL || separat == NULL )
  562.                 {
  563.                     signale( "Format ligne invalide" );
  564.                 }
  565.                 else
  566.                 {    /* Si on a indiqu‚ un num‚ro de voie: */
  567.                     /* et qu'on a trouv‚ une virgule de s‚paration des paramŠtres: */
  568.                 
  569.                     /* Pr‚caution: s‚pare les 2 paramŠtres: */
  570.                     /* On en profite pour faire pointer separat sur le 2Šme param */
  571.                     *(separat++) = '\0';    
  572.                 
  573.                     /* Cherche port concern‚: */
  574.                     device = find_device_byabrev( data );
  575.                 
  576.                     if ( device == NIL )
  577.                     {
  578.                         signale( "Affectation Voie: Port inconnu" );
  579.                     }
  580.                     else
  581.                     {    /*
  582.                          * Si on a trouv‚ le port concern‚:
  583.                          * Cr‚ation de la cnx logique: 
  584.                          */
  585.                         curr_voie = Construct_Voie( );
  586.                 
  587.                         /*
  588.                          * Num‚ro de la voie: 
  589.                          */
  590.                         curr_voie -> no_voie = atoi( object );
  591.  
  592.                         /*
  593.                          * Port utilis‚: 
  594.                          */
  595.                         curr_voie -> device = device;
  596.                         
  597.                         /*
  598.                          * Cr‚e un Long Int contenant le codename du mode: 
  599.                          */
  600.                         abrev_mode =  ( ((unsigned long)separat[0]) <<24) 
  601.                                         | ( ((unsigned long)separat[1]) <<16)
  602.                                         | ( ((unsigned long)separat[2]) <<8)
  603.                                         | ( (unsigned long)separat[3]);
  604.  
  605.                         /*
  606.                          * Cherche mode de fonctionnement: 
  607.                          */
  608.                         for ( mode = 0;  mode < NB_VMODES; mode ++ )
  609.                         {
  610.                             if ( G_abrev_mode[ mode ] == abrev_mode )
  611.                             {    /*
  612.                                  * Si on a trouv‚ l'abrev correspondante: 
  613.                                  */
  614.                                 curr_voie -> mode = mode;        /* Mode de fonctionnement */
  615.                                 break;
  616.                             }
  617.                         }
  618.                         if ( mode == NB_VMODES )
  619.                         {    /*
  620.                              * Si on a pas trouv‚: 
  621.                              */
  622.                             signale( "On a pas trouv‚ le bon mode" );
  623.                             curr_voie -> mode = VMODE_NORMAL;        /* Mode de fonctionnement */
  624.                         }
  625.                         
  626.  
  627.                         /*
  628.                          * Autres initialisations: 
  629.                          */
  630.                         voie_phase_init( curr_voie, TRUE_1 );    /* Met en INIT */
  631.  
  632.                         /*
  633.                          * Lien entre voie pr‚c‚dente et celle-ci 
  634.                          */
  635.                         *last_ptr_to_next = curr_voie;
  636.                         /*
  637.                          * Pour la prochaine voie: 
  638.                          */
  639.                         last_ptr_to_next = &(curr_voie -> next);
  640.  
  641.                         /* 
  642.                          * Une voie de + 
  643.                          */
  644.                         nb_voies ++;
  645.                     }
  646.                 }
  647.             }
  648.             else            
  649.             {    
  650.                 ping();
  651.                 printf("\nInstruction inconnue: %s", instr );
  652.             }
  653.         }
  654.     }
  655.  
  656.     /*
  657.      * Il n'y a plus de voie aprŠs la derniŠre charg‚e: 
  658.      */
  659.     *last_ptr_to_next = NULL;                /* Pas d'autre voie (pour l'instant) */
  660.  
  661.     /*
  662.      * Teste si on a charg‚e une liste de voies: 
  663.      */
  664.     if ( voies != NULL )
  665.     {    /*
  666.          * Si on a charg‚ une nouvelle liste:
  667.          * V‚rifie qu'il n'y a pas d‚j… une liste de voies en m‚moire: 
  668.          */
  669.         if ( G_voies != NULL )
  670.         {
  671.             signale( "Il ne devrait pas encore y avoir de voies en m‚moire!!!!" );
  672.             /*
  673.              * Mais c'est sans gravit‚ puisqu'on va les effacer: 
  674.              * Efface les voies en m‚moire: 
  675.              */
  676.             free_voies( G_voies );
  677.         }
  678.         
  679.         /*
  680.          * Assigne nouvelle liste de voies: 
  681.          */
  682.         G_voies = voies;                /* Adr liste */
  683.         G_nb_voies = nb_voies;        /* Nbre de voies */
  684.  
  685.     }
  686.  
  687. }
  688.  
  689.  
  690.  
  691. /*
  692.  * ------------ TRAITEMENT FICHIER .INF (Params serveur) ---------------
  693.  */
  694.  
  695.  
  696. /*
  697.  * autoload_inf(-)
  698.  *
  699.  * Purpose:
  700.  * --------
  701.  * Chargement automatique depuis le fichier STUT_ver.INF
  702.  * des chemins d'accŠs d'un serveur et des fichiers 
  703.  * concern‚s lors du lancement de STUT ONE
  704.  *
  705.  * Algorythm:
  706.  * ----------  
  707.  * - Signale qu'il n'y a pas de serv en RAM … initialiser au pr‚alable
  708.  * - Cr‚e path ds dossier de lancement
  709.  * - Appele 'load()'
  710.  *
  711.  * History:
  712.  * --------
  713.  * 1993: fplanque: Created
  714.  */
  715. void    autoload_inf( void )
  716. {
  717.     /* Variables: */
  718.         FTA    fta;                                /* File Transfer Area */
  719.  
  720.     /* 
  721.      * Signale qu'il faut PAS initialiser un serveur r‚sident 
  722.      * (puisqu'il n'y en a pas encore eu): 
  723.      */
  724.         fta .param = NO0;
  725.  
  726.     /* Fixe le chemin d'accŠs et le nom du fichier: */
  727.         strcpy( G_filepath, G_stutpath );    /* Dans le dossier STUT ONE */
  728.         strcpy( G_filename, "STUT_000.INF" );    /* Nom du Fichier … charger */
  729.         
  730.     /* Charge fichier STUT_ver.INF */
  731.         directload_file2( FS_INF, &fta, NO0 );        /* Charge slt si le fichier existe */
  732. }
  733.  
  734.  
  735. /*
  736.  * charger_param_inf(-)
  737.  *
  738.  * Purpose:
  739.  * --------
  740.  * Suite … s‚lection menu:
  741.  * Traite demande de Chargement des chemins d'accŠs d'un serveur, 
  742.  * et des fichiers concern‚s ds fichier .INF
  743.  *
  744.  * Algorythm:
  745.  * ----------  
  746.  * - Si n‚cessaire: Dem conf pour INITIALISER le serv actuellement en RAM
  747.  * - Appele 'load()'
  748.  *
  749.  * History:
  750.  * --------
  751.  * 1993: fplanque: Created
  752.  * 22.01.95: controle no de version
  753.  */
  754. void    charger_param_inf( void )
  755. {
  756.     /*
  757.      * V‚rifie si le serveur a ‚t‚ modifi‚: 
  758.      */
  759.     int    confirm      = 0;                /* Confirmation? */
  760.  
  761.     /*
  762.      * Selon statut serveur: 
  763.      */
  764.     switch( get_ServSState( ) )
  765.     {
  766.         case    SSTATE_SAVED:
  767.             confirm = form_alert( 1, 
  768.                             "[2][Pour charger un nouveau|"
  769.                                   "serveur en m‚moire, vous|"
  770.                                  "devez d'abord en supprimer|"
  771.                                  "l'ACTUEL. Voulez-vous|"
  772.                                 "l'INITIALISER maintenant?]"
  773.                                  "[Init.|Annuler]" );
  774.             break;
  775.  
  776.         case    SSTATE_MODIFIED:
  777.             confirm = form_alert( 2, 
  778.                             "[3][ATTENTION: Vous ˆtes sur le|"
  779.                                  "point d'CRASER le serveur|"
  780.                                  "actuellement en m‚moire alors|"
  781.                                  "que certaines MODIFICATIONS|"
  782.                                  "n'ont pas ‚t‚ sauv‚es!]"
  783.                                  "[craser|Annuler]" );
  784.             break;
  785.     }
  786.  
  787.  
  788.     /* 
  789.      * Selon r‚ponse utilisateur (si question il y a eu) 
  790.      */
  791.     if ( confirm < 2 )
  792.     {    /* 
  793.          * Si on a pas annul‚: 
  794.          */
  795.         FTA    fta;        /* File Transfer Area */
  796.     
  797.         /*
  798.          * Signale s'il faut initialiser un serveur r‚sident ou non: 
  799.          */
  800.         fta .param = confirm;        /* (Astuce) 0=NON, 1=OUI */
  801.  
  802.         /*
  803.          * S‚lection, (Initialise si n‚cessaire) et charge fichier *.INF 
  804.          */
  805.         load_file( "Charger ParamŠtres Serveur", FS_INF, &fta );
  806.  
  807.     }
  808.  
  809. }
  810.  
  811.  
  812. /*
  813.  * load_inf(-)
  814.  *
  815.  * Purpose:
  816.  * --------
  817.  * Chargement des donn‚es pt par pt depuis le fichier .INF
  818.  *
  819.  * Algorythm:
  820.  * ----------  
  821.  * - deselect ic“ne courante!!!!!
  822.  * - Contr“le header
  823.  * - Charge lignes d'instructions
  824.  * - Si ligne correspond a une association de fichier … un groupe:
  825.  *        charge le fichier correspondant pour:
  826.  *            - arbo
  827.  *            - pages vdt
  828.  *            - bases de donn‚es
  829.  *
  830.  * Suggest:
  831.  * --------
  832.  * Sortir la d‚select ic“ne courante, ce n'est pas une bonne place
  833.  * du point de vue de l'int‚grit‚ fonctionnelle...
  834.  *
  835.  * History:
  836.  * --------
  837.  * 1993: fplanque: Created
  838.  * 19.06.94: chgt des textes
  839.  * 22.01.95: controle no de version
  840.  */
  841. void    load_inf( FILE *fstream )
  842. {
  843.     int n_Version;
  844.     
  845.     /*
  846.      * D‚s‚lectionne ic“ne courante: 
  847.      */
  848.     deselect_current();
  849.  
  850.     /* 
  851.      * Contr“le le header:
  852.      */
  853.     n_Version = head_control( fstream, FS_INF, "ParamŠtres-Serveur" );
  854.     
  855.     /*
  856.      * Contr“le le no de version:
  857.      */
  858.     switch( n_Version )
  859.     {
  860.         case    0x0000:
  861.             break;
  862.             
  863.         case    ERROR_1:
  864.             /*
  865.              * Chargement … ‚chou‚ dans le header:
  866.              */
  867.             return;
  868.  
  869.         default:
  870.             /*
  871.              * Chargement … ‚chou‚ 
  872.              */
  873.             alert( BAD_VERSION );
  874.             return;
  875.     }
  876.  
  877.     /*
  878.      * Si le header est correct: 
  879.      */
  880.     {    /* 
  881.          * Variables: 
  882.          */
  883.         char    *instr;        /* Action a effectuer */
  884.         char    *object;        /* Donn‚e … modifier */
  885.         char    *data;        /* Contenu … charger */
  886.         /* ATTENTION, ces variables vont en fait pointer dans M_buffer, ne pas faire de free */
  887.  
  888.         /* 
  889.          * Boucle de chargement: 
  890.          */
  891.         while ( !feof( fstream ) )
  892.         {    /* Tant qu'on est pas … la fin du fichier: */
  893.             instr = get_config_line( fstream, '=', &object, &data );
  894.  
  895.         /* Test de l'instruction … traiter: */
  896.             if ( instr != NULL )
  897.             {    /* S'il y a une instruction: */
  898.  
  899.                 if ( strcmp( instr, "GROUP") == 0 )
  900.                 {    /* 
  901.                       * Assignement d'un fichier … un groupe: 
  902.                       */
  903.                 
  904.                     if ( object != NULL )
  905.                     {
  906.                         /*
  907.                          * Cherche l'instr concern‚e: 
  908.                          */
  909.                         if ( strcmp( object, "ARB:" ) == 0 )
  910.                         {    /* 
  911.                             * Chargement des pages arbo 
  912.                             */
  913.                             group_directload( find_datagroup_byType( DTYP_ARBO ), FS_ARBO, data );
  914.                         }
  915.                         else if ( strcmp( object, "ECR:" ) == 0 )
  916.                         {    /* 
  917.                              * Chargement des pages ‚cran 
  918.                              */
  919.                             group_directload( find_datagroup_byType( DTYP_PAGES ), GF_PAGES_ECRAN, data ); 
  920.                         }
  921.                         else if ( strcmp( object, "DAT:" ) == 0 )
  922.                         {    /* 
  923.                               * Chargement des bases de donn‚es: 
  924.                               */
  925.                             group_directload( find_datagroup_byType( DTYP_DATAS ), FS_DATAS, data ); 
  926.                         }
  927.                         else if ( strcmp( object, "TXT:" ) == 0 )
  928.                         {    /* 
  929.                               * Chargement des textes: 
  930.                               */
  931.                             group_directload( find_datagroup_byType( DTYP_TEXTS ), FS_TEXTES, data ); 
  932.                         }
  933.                     }
  934.                     else
  935.                     {
  936.                         signale("Ligne non valide");
  937.                     }
  938.                 }
  939.                 else
  940.                 {
  941.                     signale("Instruction inconnue");
  942.                 }
  943.             }
  944.         }
  945.     }
  946. }
  947.  
  948.  
  949. /*
  950.  * sauver_param_inf(-)
  951.  *
  952.  * Purpose:
  953.  * --------
  954.  * Suite … s‚lection menu:
  955.  * Traite demande de Sauvegarde des chemins d'accŠs d'un serveur
  956.  * dans fichier .INF
  957.  *
  958.  * Algorythm:
  959.  * ----------  
  960.  * - Demande confirm/type (param d‚faut ou fichier ind‚pendant)
  961.  * - Cr‚e nom si d‚faut
  962.  * - Appele 'sauve()' -> save_infdata()
  963.  *
  964.  * Notes:
  965.  * ------
  966.  *
  967.  *
  968.  * History:
  969.  * --------
  970.  * 1993: fplanque: Created
  971.  */
  972. void    sauver_param_inf( void )
  973. {
  974.     /* 
  975.      * Demande de confirmation: 
  976.      */
  977.     int    confirm = form_alert(2,
  978.                             "[2][  Voulez-vous sauver les|"
  979.                                  "  paramŠtres-serveur par|"
  980.                                  "  d‚faut ou un fichier de|"
  981.                                  "  paramŠtres ind‚pendant?]"
  982.                                  "[D‚faut|Ind‚pend|Annuler]");
  983.  
  984.     /* 
  985.      * Selon r‚ponse utilisateur: 
  986.      */
  987.     switch ( confirm )
  988.     {
  989.         case    1:                /* ParamŠtres par d‚faut: */
  990.             strcpy( G_filepath, G_stutpath );    /* Dans le dossier STUT ONE */
  991.             strcpy( G_filename, "STUT_000.INF" );    /* Nom du Fichier … sauver */
  992.             /*    printf("Path=%s  Name=%s \n",  G_filepath, G_filename ); */
  993.  
  994.             directsave_file( FS_INF, NULL );        /* Sauve les infos du serveur courant dans ce fichier */
  995.             break;
  996.     
  997.         case    2:                /* Ind‚pendant */
  998.             save_file( "Sauver ParmŠtres-Serveur", FS_INF, NULL );
  999.             break;
  1000.     }
  1001. }
  1002.  
  1003.  
  1004. /*
  1005.  * save_infdata(-)
  1006.  *
  1007.  * Purpose:
  1008.  * --------
  1009.  * Sauvegarde des donn‚es pt par pt dans les fichier .INF
  1010.  *
  1011.  * Algorythm:
  1012.  * ----------  
  1013.  * Sauve:
  1014.  * -Chemins d'accŠs aux fichiers serveur
  1015.  *
  1016.  * History:
  1017.  * --------
  1018.  * 1993: fplanque: Created
  1019.  */
  1020. void    save_infdata( FILE *fstream )
  1021. {
  1022.     int            i;
  1023.     DATAGROUP    *datagroup;        /* Datagroup en cours de traitement */
  1024.  
  1025.     /* Commentaire: */
  1026.     fputs( "\r\n[ Chemins d'accŠs aux fichiers serveur: ]\r\n\r\n", fstream );
  1027.  
  1028.     /* Sauve chemins d'accŠs serveur: */
  1029.     for ( i = 0; i < NB_DATAGROUPS; i++ )
  1030.     {
  1031.         datagroup = &G_datagroups[ i ];    /* Datagroup … traiter */
  1032.         if ( datagroup -> filepath != NULL )
  1033.         {    /* Si le Datagroup en question … un chemin+fichier associ‚: */
  1034.             fprintf( fstream, "GROUP %s=%s\\%s\r\n",
  1035.                             datagroup -> data_device,     /* Nom du groupe */
  1036.                             datagroup -> filepath,        /* Path */
  1037.                             datagroup -> filename );    /* Fichier */
  1038.         }
  1039.     }
  1040. }
  1041.  
  1042.  
  1043.  
  1044. /*
  1045.  * ------------ AFFECTATION DES VOIES UTILISEES PAR LE SERV ---------------
  1046.  */
  1047.  
  1048.  
  1049. /*
  1050.  * affecte_voies(-)
  1051.  *
  1052.  * Purpose:
  1053.  * --------
  1054.  * Affectation des voies utilis‚es par le serveur
  1055.  *
  1056.  * Algorythm:
  1057.  * ----------  
  1058.  * - Duplique la liste chaŒn‚e d'infos sur les voies.
  1059.  *   (La copie peut alors ˆtre modifi‚e, ‚tendue, diminu‚e tout
  1060.  *        en conservant la possibilit‚ d'annuler ult‚rieurement)
  1061.  * - Cr‚e une liste textuelle des voies
  1062.  *        utilise cree_ligne_voie()
  1063.  * - Eteinds fonctions non dispo tant qu'aucune ligne de la liste 
  1064.  *       textuelle n'est s‚lectionn‚
  1065.  * - DIALOGUE avec utilisateur: select_in_list() ~> affecte_actions()
  1066.  * - LibŠre liste textuelle
  1067.  * - Selon r‚sultat dialogue: on garde l'une ou l'autre des 
  1068.  *        listes chaŒn‚es complŠtes
  1069.  *
  1070.  * Suggest:
  1071.  * --------
  1072.  * Le param M_voie_copies devrait etre integre ds list_handles
  1073.  *
  1074.  * History:
  1075.  * --------
  1076.  * 1993: fplanque: Created
  1077.  * 04.01.94: nouveau format d'appel de select_in_list()
  1078.  */
  1079. void affecte_voies( const GRECT *start_box )
  1080. {
  1081.     /* 
  1082.      * Pointeurs: 
  1083.      */
  1084.     VOIE        *curr_voie;                    /* Voie en cours de traitement */
  1085.     char        * *param_array;            /* Tableau de ptr sur chaines */
  1086.     
  1087.     /* 
  1088.      * Variables: 
  1089.      */
  1090.     int        i;                                /* Compteur */
  1091.     int        nb_lignes = G_nb_voies;    /* Nbre de lignes = Nb voies … l'origine */
  1092.     
  1093.     static int    esc_objs[]={ AFFECAJ, AFFECMOD, AFFECSUP, AFFECVAL, AFFECANN, NIL };
  1094.     int        exit_obj;                    /* Objet de sortie */
  1095.     GRECT        form_box;                    /* Dimensions du formulaire */
  1096.     
  1097.     
  1098.     
  1099.     /*
  1100.      * Duplique la liste chain‚e des infos complŠtes sur les 
  1101.      * voies pour l'‚dition (on gardera l'une ou l'autre selon que
  1102.      * l'utilisateur confirme ou annule): 
  1103.      */
  1104.     M_voies_copies = dup_voies( G_voies );
  1105.     
  1106.     
  1107.     
  1108.     /*
  1109.      * Cr‚ation liste textuelle des voies:
  1110.      */
  1111.     param_array = (char * *) MALLOC( sizeof( char* ) * nb_lignes );
  1112.     curr_voie = M_voies_copies;            /* Ptr sur 1ere voie */
  1113.     for ( i=0; i<nb_lignes; i++ )
  1114.     {
  1115.         /* Cr‚e une ligne sur la voie et sauve ptr ds tableau: */
  1116.         param_array[ i ] = cree_ligne_voie( curr_voie );
  1117.     
  1118.         /* Voie suivante: */
  1119.         curr_voie = curr_voie -> next;
  1120.     }
  1121.     
  1122.     
  1123.     /* 
  1124.      * "Eteind" fonctions non (encore) disponibles: 
  1125.      */
  1126.     objc_setdisable( M_affect_adr, AFFECMOD );
  1127.     objc_setdisable( M_affect_adr, AFFECSUP );
  1128.     
  1129.     
  1130.     /* 
  1131.      * BoŒte de Dialogue avec utilisateur: 
  1132.      */
  1133.     /* App prend en charge souris */
  1134.     WIND_UPDATE_BEG_MCTRL
  1135.     
  1136.     exit_obj = select_in_list( 
  1137.                         M_affect_adr, 
  1138.                         start_box, 
  1139.                         &form_box,
  1140.                         ¶m_array, 
  1141.                         &nb_lignes,
  1142.                         esc_objs, 
  1143.                         affecte_actions,         /* Ptr sur func de ttmnt des actions */
  1144.                         affec_fixstate_act,    /* Ptr sur func … appeller pour allumer/eteindre boutons d'actions */
  1145.                         0 );
  1146.     
  1147.     /* AES peut reprendre la souris */
  1148.     WIND_UPDATE_END_MCTRL
  1149.  
  1150.     
  1151.     /*
  1152.      * LibŠre liste textuelle: 
  1153.      */
  1154.     for ( i=0; i<nb_lignes; i++ )
  1155.     {
  1156.         FREE(    param_array[ i ] );
  1157.     }
  1158.     FREE( param_array );
  1159.     
  1160.         
  1161.     /* 
  1162.      * Teste s'il y a eu confirmation -> Prise en compte modifs: 
  1163.      */
  1164.     if ( exit_obj == AFFECVAL )
  1165.     {    /*
  1166.          * Si on a valid‚: 
  1167.          */
  1168.     
  1169.         /* 
  1170.          * Efface les anciennes donn‚es: 
  1171.          */
  1172.         free_voies( G_voies );
  1173.     
  1174.         /* 
  1175.          * Valide les nouvelles: 
  1176.          */
  1177.         G_voies = M_voies_copies;
  1178.     
  1179.         /* 
  1180.          * Compte le nbre de voies: 
  1181.          */
  1182.         G_nb_voies = 0;
  1183.         curr_voie = G_voies;
  1184.         while( curr_voie != NULL )
  1185.         {
  1186.             G_nb_voies ++;
  1187.             curr_voie = curr_voie -> next;
  1188.         }            
  1189.     
  1190.     }
  1191.     else
  1192.     {    /* 
  1193.          * Si on a annul‚: 
  1194.          */
  1195.     
  1196.         /* 
  1197.          * Efface simplement la copie des donn‚es:
  1198.          */        
  1199.         free_voies( M_voies_copies );
  1200.     
  1201.     }
  1202.     
  1203.     /* 
  1204.      * Safety: On ne doit plus utiliser la copie: 
  1205.      */
  1206.     M_voies_copies = NULL;
  1207.  
  1208. }
  1209.  
  1210.  
  1211.  
  1212. /*
  1213.  * affecte_actions(-)
  1214.  *
  1215.  * Purpose:
  1216.  * --------
  1217.  * Traitement des objets exit du formulaire affich‚ par 
  1218.  * affecte_voies()
  1219.  *
  1220.  * Algorythm:
  1221.  * ----------  
  1222.  * - Si on a cliqu‚ sur un nom: RIEN
  1223.  * - Si on a cliqu‚ sur un bouton d'action:
  1224.  *       Traite le cas appropri‚ au bouton
  1225.  *            - Valider/Annuler: quitter dialogue
  1226.  *            - Ajouter une voie
  1227.  *
  1228.  * Notes:
  1229.  * ------
  1230.  * On ne fait RIEN lorsque l'on clique sur un elt ds la liste...
  1231.  *
  1232.  * History:
  1233.  * --------
  1234.  * 1993: fplanque: Created
  1235.  * 04.01.94: l'allumage des bout d'actions lors de la sel d'un elt se fait d‚sormais hors-d'ici
  1236.  * 05.01.94: ajout de la <suppression d'une voie>
  1237.  * 07.01.95: gestion double click
  1238.  */
  1239. int    affecte_actions(                         /* Out: FALSE0 : Il faut terminer le dialogue 
  1240.                                                      *          TRUE_1 : Il faut continuer le dialogue normalement
  1241.                                                      *          CHANGE_2 : Continue, MAIS ATTENTION: La liste a chang‚
  1242.                                                      */
  1243.             LISTHANDLES *list_handles,        /* In: Ptr sur infos sur la liste & le dialogue affich‚s */
  1244.             int    obj )                            /* In: Objet du form sur lequel on a cliqu‚ */
  1245. {
  1246.     if( obj & SEL_LINE )
  1247.     {
  1248.         if( obj & DBLE_CLICLK )
  1249.         {    /*
  1250.             * Si on a double cliqu‚ sur un nom:
  1251.               * Dialogue de config des voies:
  1252.              */
  1253.             Affecte_ParamsVoie( list_handles, M_affect_adr, AFFECMOD );
  1254.         }
  1255.     }
  1256.     else
  1257.     {    /*
  1258.          * Si on a cliqu‚ sur un bouton d'action:
  1259.          */
  1260.         switch( obj )
  1261.         {    /* 
  1262.              * Selon le bouton sur lequel on a cliqu‚:
  1263.              */
  1264.             case    AFFECVAL:            /* Valider */
  1265.             case    AFFECANN:            /* Annuler */
  1266.                 return    FALSE0;        /* Met fin au dialogue */
  1267.  
  1268.             case    AFFECAJ:                /* Ajouter une voie: */
  1269.                 /*
  1270.                  * Ajoute une voie complŠte … la liste chain‚e
  1271.                  */
  1272.                 ajoute_voie( list_handles );
  1273.  
  1274.                 /* 
  1275.                  * "Allume" nlles ations disponibles: 
  1276.                  */
  1277.                 affec_fixstate_act( list_handles );
  1278.  
  1279.                 return    CHANGE_2;        /* On a chang‚ la liste, il va falloir r‚afficher et initialiser variables */
  1280.  
  1281.             case    AFFECMOD:                /* Modifier les params d'une voie: */
  1282.                 /*
  1283.                  * Dialogue de config des voies:
  1284.                  */
  1285.                 Affecte_ParamsVoie( list_handles, M_affect_adr, AFFECMOD );
  1286.                  
  1287.                 return    TRUE_1;
  1288.  
  1289.             case    AFFECSUP:                /*    Supprimer une voie: */
  1290.                 /*
  1291.                  * Supprime une voie complŠte de la liste chain‚e
  1292.                  */
  1293.                 supprime_voie( list_handles );
  1294.  
  1295.                 /* 
  1296.                  * "Eteinds" ations eventuellement devenues indisponibles: 
  1297.                  * (Bouton "Supprimer" uniquement)
  1298.                  */
  1299.                 affec_fixstate_act( list_handles );
  1300.  
  1301.                 return    CHANGE_2;        /* On a chang‚ la liste, il va falloir r‚afficher et initialiser variables */
  1302.                 
  1303.             default:
  1304.                 ping();
  1305.         }
  1306.  
  1307.     }
  1308.     
  1309.     return    TRUE_1;            /* Continue dialogue */
  1310. }
  1311.  
  1312.  
  1313.  
  1314. /*
  1315.  * ParamsVoie(-)
  1316.  *
  1317.  * Purpose:
  1318.  * --------
  1319.  * ParamŠtres d'une voie
  1320.  *
  1321.  * Algorythm:
  1322.  * ----------  
  1323.  * Cherche voie concern‚e dans la copie de liste de voies
  1324.  * Modifie les valeurs suivantes:
  1325.  *        no_voie
  1326.  *        device
  1327.  *        mode    
  1328.  *
  1329.  * Notes:
  1330.  * ------
  1331.  * On ne peut pour l'instant ‚diter le no de la voie!
  1332.  *
  1333.  * History:
  1334.  * --------
  1335.  * 10.05.94: fplanque: Created based on parapg_parasortie(-)
  1336.  */
  1337. void    Affecte_ParamsVoie( 
  1338.             LISTHANDLES *list_handles,     /* In: Infos sur liste de voies */
  1339.             OBJECT *arbre_fond,                 /* In: Formulaire appellant */
  1340.             int call_obj )                        /* In: Objet appellant ds ce formulaire */
  1341. {
  1342.     /* 
  1343.      * Ligne/Champ concern‚: 
  1344.      */
  1345.     int    concerned_line = get_no_selitem( list_handles );
  1346.  
  1347.     /* 
  1348.      * Ptrs sur Objets formulaire: 
  1349.      */
  1350.     char*        pT_NoVoie = (M_pForm_ParamsVoie[ VOIENUM ] .ob_spec.tedinfo) -> te_ptext;
  1351.     OBJECT*    pOb_Port  = &M_pForm_ParamsVoie[ VOIEPORT ];
  1352.     OBJECT*    pOb_Mode  = &M_pForm_ParamsVoie[ VOIEMODE ];
  1353.  
  1354.     /* 
  1355.      * Trouve les parametres de la voie concern‚e: 
  1356.      */
  1357.     VOIE* pVoie_Params = find_ParamsVoie_byOrdNo( M_voies_copies, concerned_line );
  1358.  
  1359.     /* 
  1360.      * Variables: 
  1361.      */
  1362.     int    n_NoVoie    = pVoie_Params -> no_voie;    
  1363.     int    n_Device    = pVoie_Params -> device;    /* Device de la voie ‚dit‚e */
  1364.     int    n_Mode    = pVoie_Params -> mode;
  1365.     int    edit_obj = NIL_1;                            /* Objet en cours d'‚dition */
  1366.     int    exit_obj;                                    /* Bouton Exit cliqu‚ */
  1367.     GRECT    start_box, form_box;
  1368.  
  1369.     /* 
  1370.      * Fixe les valeurs dans le formulaire: 
  1371.      */
  1372.     /* No de la voie: */
  1373.     itoa( n_NoVoie, pT_NoVoie, 10 );            /* Conversion d‚cimale */
  1374.     /* Nom du port (Pop-Up): */
  1375.     fix_popup_title( pOb_Port, G_inst_drv_list, n_Device );
  1376.     /* Mode de fonctionnement: */    
  1377.     fix_popup_title( pOb_Mode, G_Popup_Modes, n_Mode );
  1378.     
  1379.  
  1380.     /* 
  1381.      * Gestion formulaire: 
  1382.      */
  1383.     /* Coord de d‚part du grow_box= */
  1384.     objc_xywh( arbre_fond, call_obj, &start_box );
  1385.     /*vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv*/
  1386.     open_dialog( M_pForm_ParamsVoie, &start_box, &form_box );
  1387.  
  1388.     while(1)
  1389.     {    /* 
  1390.         * Gestion form jusqu'… un clic sur objet exit 
  1391.         */
  1392.         exit_obj = ext_form_do( M_pForm_ParamsVoie, &edit_obj);
  1393.         /*    exit_obj &= 0x7FFF;        /* Masque bit 15 (Double-clic) */
  1394.     
  1395.         /*
  1396.          * Teste si on cherche … sortir: 
  1397.          */
  1398.         if ( exit_obj == VOIEVAL  ||  exit_obj == VOIEANN )
  1399.             break;
  1400.  
  1401.         /* 
  1402.          * Traitement des autres boutons: 
  1403.          */
  1404.         switch( exit_obj )
  1405.         {
  1406.             case    VOIEPORT:
  1407.             case    VOIPORUP:
  1408.             {    /* 
  1409.                  * S‚lection du port utilis‚ par la voie:
  1410.                  */
  1411.                 int            selected;        /* Ligne s‚lectionn‚e */
  1412.                 POPUP_ENTRY    *entries;        /* Liste pour menu: */
  1413.                 
  1414.                 /* 
  1415.                  * Fix Ptr sur liste appropri‚e (Drivers install‚s): 
  1416.                  */
  1417.                 entries = G_inst_drv_list;
  1418.                     
  1419.                 /*
  1420.                  * Appelle le Pop-Up: 
  1421.                  */
  1422.                 selected = popup_inform( 
  1423.                                     M_pForm_ParamsVoie, exit_obj, VOIEPORT, 
  1424.                                     entries, n_Device );    
  1425.                 if ( selected != ABORT_2 )
  1426.                 {
  1427.                     n_Device = selected;
  1428.                     fix_popup_title( pOb_Port, entries, n_Device );
  1429.                     objc_draw( M_pForm_ParamsVoie, VOIEPORT, 1, 
  1430.                                     form_box .g_x, form_box .g_y,
  1431.                                     form_box .g_w, form_box .g_h );
  1432.                 }
  1433.                 break;
  1434.             }
  1435.  
  1436.             case    VOIEMODE:
  1437.             case    VOIMODUP:
  1438.             {    /* 
  1439.                  * S‚lection du mode de fonctionnement de la voie:
  1440.                  */
  1441.                 int            selected;        /* Ligne s‚lectionn‚e */
  1442.                 POPUP_ENTRY    *entries;        /* Liste pour menu: */
  1443.                 
  1444.                 /* 
  1445.                  * Fix Ptr sur liste appropri‚e (Drivers install‚s): 
  1446.                  */
  1447.                 entries = G_Popup_Modes;
  1448.                     
  1449.                 /*
  1450.                  * Appelle le Pop-Up: 
  1451.                  */
  1452.                 selected = popup_inform( 
  1453.                                     M_pForm_ParamsVoie, exit_obj, VOIEMODE, 
  1454.                                     entries, n_Mode );    
  1455.                 if ( selected != ABORT_2 )
  1456.                 {
  1457.                     n_Mode = selected;
  1458.                     fix_popup_title( pOb_Mode, entries, n_Mode );
  1459.                     objc_draw( M_pForm_ParamsVoie, VOIEMODE, 1, 
  1460.                                     form_box .g_x, form_box .g_y,
  1461.                                     form_box .g_w, form_box .g_h );
  1462.                 }
  1463.                 break;
  1464.             }
  1465.  
  1466.             default:
  1467.                 ping();
  1468.         }
  1469.  
  1470.         
  1471.     /* D‚s‚lection du bouton s‚lectionn‚: */
  1472.     /*    objc_dsel( M_pForm_ParamsVoie, exit_obj ); */
  1473.     
  1474.         graf_mouse( ARROW, 0);                    /* souris: FlŠche */
  1475.     }
  1476.  
  1477.     graf_mouse( BUSYBEE, 0);                /* souris: Abeille */
  1478.     close_dialog( M_pForm_ParamsVoie, exit_obj, &start_box, &form_box );
  1479.     /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  1480.  
  1481.     /* 
  1482.      * D‚s‚lectionne bouton de sortie: 
  1483.      */
  1484.     objc_clrsel( M_pForm_ParamsVoie, exit_obj );
  1485.  
  1486.     /* 
  1487.      * Red‚ssinne le fond: 
  1488.      */
  1489.     objc_draw( arbre_fond, 0, 5, form_box .g_x, form_box .g_y, form_box .g_w, form_box .g_h );
  1490.  
  1491.     /* 
  1492.      * Sauvegarde des valeurs ‚dit‚es: 
  1493.      */
  1494.     if ( exit_obj == VOIEVAL )
  1495.     {    /* 
  1496.           * Si on a confirm‚: 
  1497.           */
  1498.         /* 
  1499.          * Variables: 
  1500.          */
  1501.         char    * *path_array = *(list_handles -> pTpsz_array);
  1502.         char    * *resume = &path_array[ concerned_line ];    /* R‚sum‚ des paramŠtres */
  1503.  
  1504.         /* 
  1505.          * Sauvegarde modifs: 
  1506.          */
  1507.         pVoie_Params -> device = n_Device;    /* Device de la voie ‚dit‚e */
  1508.         pVoie_Params -> mode = n_Mode;
  1509.  
  1510.         /* 
  1511.          * Modifie la ligne dans le formulaire: 
  1512.          * Efface ancienne ligne: 
  1513.          */
  1514.         if ( *resume != G_empty_string )        /* Si pas d‚j… vide: */
  1515.         {
  1516.             FREE( *resume );                            /* LibŠre ancien contenu */
  1517.         }
  1518.         /* 
  1519.          * Cr‚e nouvelle ligne et place ptr dans tableau: 
  1520.          */
  1521.         *resume = cree_ligne_voie( pVoie_Params );
  1522.         /* 
  1523.          * Fixe nlle ligne 
  1524.          */
  1525.         list_fix1name( M_affect_adr, list_handles -> selected_line, *resume );
  1526.         
  1527.     }
  1528.  
  1529. }
  1530.  
  1531.  
  1532.  
  1533. /*
  1534.  * find_ParamsVoie_byOrdNo(-)
  1535.  *
  1536.  * Purpose:
  1537.  * --------
  1538.  * Trouve les parametres d'une voie en fnct de son num‚ro d'ordre
  1539.  * dans la liste des voies
  1540.  *
  1541.  * History:
  1542.  * --------
  1543.  * 10.05.94: fplanque: Cr‚ation bas‚e sur find_fieldpar_byordno
  1544.  */
  1545. VOIE*    find_ParamsVoie_byOrdNo(    /* Out: Ptr sur params voie cherch‚e */
  1546.             VOIE *pVoie_Liste,         /* In:  Ptr sur premiŠre voie ds liste */
  1547.             int ord )                    /* In:  No d'ordre de la voie cherch‚e */
  1548. {
  1549.     int    i=0;        /* Compteur */
  1550.  
  1551.     while( i < ord  &&  pVoie_Liste != NULL )
  1552.     {    /* 
  1553.          * Tant qu'on est pas arriv‚ au champ qui nous int‚resse
  1554.          * et qu'on est pas … la fin de la liste: 
  1555.          */
  1556.         /* 
  1557.          * Passe au champ suivant:
  1558.          */
  1559.         i ++;
  1560.         pVoie_Liste = pVoie_Liste -> next;
  1561.     }
  1562.  
  1563.     return    pVoie_Liste;        /* Ptr sur params; NULL si pas trouv‚ */
  1564. }
  1565.  
  1566.  
  1567.  
  1568. /*
  1569.  * affec_fixstate_act(-)
  1570.  *
  1571.  * Purpose:
  1572.  * --------
  1573.  * Selon qu'une voie est courament selectionn‚e ds la liste textuelle:
  1574.  * Allume ou eteind en direct les boutons d'action associ‚s.
  1575.  *
  1576.  * Algorythm:
  1577.  * ----------
  1578.  * - D‚termine si une ligne est s‚lectionn‚e...
  1579.  * - Allume/Eteind les boutons:
  1580.  *     - MODIFIER
  1581.  *     - SUPPRIMER (Allume Seulement si + d'une voie ds la liste: on ne 
  1582.  *                        peut supprimer la derniŠre)
  1583.  *
  1584.  * History:
  1585.  * --------
  1586.  * 03.01.94: fplanque: Created pour allulage seulement
  1587.  * 04.01.94: fplanque: Reconnaissance auto allumage/extinction
  1588.  */
  1589. void    affec_fixstate_act(                     /* Out: Rien */
  1590.             LISTHANDLES *list_handles )    /* In: Ptr sur infos sur la liste & le dialogue affich‚s */
  1591. {
  1592.  
  1593.     if( list_handles -> selected_line != NIL )
  1594.     {    /*
  1595.          * S'il y a une ligne s‚lectionn‚e: il faut ALLUMER:
  1596.          */
  1597.  
  1598.         /*
  1599.          * Bouton MODIFIER:
  1600.          */
  1601.         objc_enable( M_affect_adr, AFFECMOD );
  1602.         
  1603.         /*
  1604.          * Bouton SUPPRIMER:
  1605.          */
  1606.         if ( list_handles -> nb_items > 1 ) 
  1607.         {    /*
  1608.              * On ne pourrait effacer la derniŠre voie!
  1609.              * S'il y en a donc plus d'une:
  1610.              */
  1611.             objc_enable( M_affect_adr, AFFECSUP );
  1612.         }
  1613.         else
  1614.         {    /*
  1615.              * Si 1 seule voie est pr‚sente:
  1616.              * On ne peut l'effacer
  1617.              */
  1618.             objc_disable( M_affect_adr, AFFECSUP );
  1619.         }
  1620.     }
  1621.     else
  1622.     {    /*
  1623.          * S'il n'y a PAS de ligne s‚lectionn‚e: il faut ETEINDRE:
  1624.          */
  1625.         objc_disable( M_affect_adr, AFFECMOD );
  1626.         objc_disable( M_affect_adr, AFFECSUP );
  1627.     }
  1628. }
  1629.  
  1630.  
  1631.  
  1632.  
  1633.  
  1634.  
  1635. /*
  1636.  * cree_ligne_voie(-)
  1637.  *
  1638.  * Purpose:
  1639.  * --------
  1640.  * Cr‚e une ligne d'infos sur une voie pour l'ins‚rer 
  1641.  * ds liste d'affectations
  1642.  *
  1643.  * History:
  1644.  * --------
  1645.  * 1993: fplanque: Created
  1646.  */
  1647. char    *cree_ligne_voie( VOIE *curr_voie )
  1648. {
  1649.     int    dev_offset = device_offset( curr_voie -> device );
  1650.  
  1651.     /*
  1652.      * Cr‚e une chaine r‚sumant les paramŠtres principaux 
  1653.      */
  1654.     sprintf( G_tmp_buffer, "Voie %03d:  Port=%-10sMode=%s",
  1655.                      curr_voie -> no_voie,
  1656.                      G_inst_drv_list[ dev_offset ] .name +2,
  1657.                      G_mode[ curr_voie -> mode ]    );
  1658.  
  1659.     /* 
  1660.      * Retourne adresse d'une copie de la chaine cr‚‚e: 
  1661.      */
  1662.     /*    printf("%s  long=%lu\n", G_tmp_buffer, strlen(G_tmp_buffer) ); */
  1663.     return    STRDUP(G_tmp_buffer);
  1664. }
  1665.  
  1666.  
  1667. /*
  1668.  * ajoute_voie(-)
  1669.  *
  1670.  * Purpose:
  1671.  * --------
  1672.  * Ajoute 1 voie … la liste d'affectations
  1673.  *
  1674.  * Algorythm:
  1675.  * ----------  
  1676.  * - Cherche premier no libre … attribuer … la nouvelle voie
  1677.  * - Alloue nouvelle voie complete, l'initialise et l'insŠre 
  1678.  *    ds liste chain‚e des voie … l'endroit correspondant … son no.
  1679.  * - Ajoute la ligne correspondante dans la liste de s‚lection textuelle associ‚e
  1680.  * - S‚lectionne cette nouvelle voie
  1681.  *
  1682.  * History:
  1683.  * --------
  1684.  * 1993: fplanque: Created
  1685.  * 05.01.93: Modif de la position auto de la partie visible sur nlle voie: on peut maintenant aussi remonter
  1686.  */
  1687. void    ajoute_voie( LISTHANDLES *list_handles )
  1688. {
  1689.     /* 
  1690.      * Pointeurs: 
  1691.      */
  1692.     VOIE    *curr_voie = M_voies_copies;    /* Voie en cours de traitement */
  1693.     VOIE    * *last_ptr_tonext = &M_voies_copies;
  1694.     VOIE    *new_voie;
  1695.     char    * *param_array;
  1696.     
  1697.     /* 
  1698.      * Variables: 
  1699.      */
  1700.     int    new_no_voie = 1;
  1701.     int    nb_items;
  1702.     int    selected_line;
  1703.  
  1704.     /* 
  1705.      * Cherche no … attribuer par d‚faut … la nlle voie: 
  1706.      */
  1707.     while (     curr_voie != NULL 
  1708.             && curr_voie -> no_voie == new_no_voie )
  1709.     {
  1710.         new_no_voie ++;        /* Ce no ne convient pas, on passe au suivant */
  1711.         last_ptr_tonext = &(curr_voie -> next);
  1712.         curr_voie = curr_voie -> next;
  1713.     }
  1714.  
  1715.     /* 
  1716.      * ------------------------------
  1717.      * Alloue nouvelle voie complŠte: 
  1718.      * ------------------------------
  1719.      */
  1720.     new_voie = Construct_Voie( );
  1721.     /*
  1722.      * Init paramŠtres: 
  1723.      */
  1724.     new_voie -> no_voie = new_no_voie;        /* Num‚ro de la voie */
  1725.     new_voie -> device = G_term_dev;            /* Port terminal par d‚faut */
  1726.     new_voie -> mode = VMODE_NORMAL;            /* Mode de fonctionnement */
  1727.     voie_phase_init( new_voie, TRUE_1 );    /* Met la voie en phase INIT */
  1728.  
  1729.     /* 
  1730.      * Liaison avec le reste: 
  1731.      */
  1732.     new_voie -> next = curr_voie;
  1733.     *last_ptr_tonext = new_voie;
  1734.  
  1735.     /* 
  1736.      * -------------------------------------------------------
  1737.      * Une ligne de plus dans la liste de s‚lection textuelle: 
  1738.      * -------------------------------------------------------
  1739.      */
  1740.     (list_handles -> nb_items) ++;        /* 1 elt de plus */
  1741.     nb_items = list_handles -> nb_items;
  1742.  
  1743.     /*
  1744.      * Agrandi la liste: 
  1745.      */
  1746.     param_array = (char * *) REALLOC( *(list_handles -> pTpsz_array), nb_items * sizeof( char * ) );
  1747.     *(list_handles -> pTpsz_array) = param_array;
  1748.     /*
  1749.      * D‚cale la fin de la liste: 
  1750.      */
  1751.     if ( new_no_voie < nb_items )
  1752.     {    /* 
  1753.          * S'il y a qque chose … d‚caler: 
  1754.          */
  1755.         memcpy(    ¶m_array[ new_no_voie ], ¶m_array[ new_no_voie - 1 ], (nb_items - new_no_voie) * sizeof( char * ) );
  1756.     }
  1757.     /*
  1758.      * Cr‚e une nouvelle ligne dans la liste: 
  1759.      */
  1760.     param_array[ new_no_voie - 1 ] = cree_ligne_voie( new_voie );
  1761.  
  1762.     /* 
  1763.      * Nouvelle ligne s‚lectionn‚e: 
  1764.      */
  1765.     selected_line = new_no_voie - list_handles -> top_item -1 + list_handles -> first_name;
  1766.  
  1767.     /*
  1768.      * V‚rifie qu'on est dans la partie visible: 
  1769.      */
  1770.     if ( selected_line > list_handles -> last_name )
  1771.     {    /* 
  1772.          * Si on est trop haut: 
  1773.          * On va d‚scendre l'affichage dans la liste: 
  1774.          */
  1775.         list_handles -> top_item += selected_line - list_handles -> last_name;
  1776.         selected_line = list_handles -> last_name;
  1777.     }
  1778.     else if( selected_line < list_handles -> first_name ) 
  1779.     {    /* 
  1780.          * Si on est trop bas: 
  1781.          * On va monter l'affichage dans la liste: 
  1782.          */
  1783.         list_handles -> top_item -= list_handles -> first_name - selected_line;
  1784.         selected_line = list_handles -> first_name;
  1785.     }
  1786.  
  1787.     list_handles -> selected_line = selected_line;
  1788.  
  1789.     
  1790. }
  1791.  
  1792.  
  1793. /*
  1794.  * supprime_voie(-)
  1795.  *
  1796.  * Purpose:
  1797.  * --------
  1798.  * Supprime 1 voie de la liste d'affectations
  1799.  *
  1800.  * History:
  1801.  * --------
  1802.  * 05.01.94: fplanque: Created
  1803.  */
  1804. void    supprime_voie(                         /* Out: Rien */
  1805.             LISTHANDLES *list_handles )    /* In/Out: ParamŠtres de la liste de s‚lection */
  1806. {
  1807.     /* 
  1808.      * Pointeurs: 
  1809.      */
  1810.     VOIE    *curr_voie = M_voies_copies;    /* Voie en cours de traitement */
  1811.     VOIE    * *last_ptr_tonext = &M_voies_copies;
  1812.     char    * *select_array = *(list_handles -> pTpsz_array);    /* Tableau de chaines de charactŠres */
  1813.     
  1814.     /* 
  1815.      * Variables: 
  1816.      */
  1817.     int    no_selitem = get_no_selitem( list_handles );    /* No de l'elt de liste s‚lectionn‚ */
  1818.     int    nb_items = list_handles -> nb_items;
  1819.     int    count = 0;                                /* Compteur de voies */
  1820.  
  1821.  
  1822.     /* 
  1823.      * Cherche la voie … supprimer: 
  1824.      * no_selitem=0 => il faut supprimer la 1ere voie
  1825.      */
  1826.     /* printf( "\033Y!!No de l'elt s‚lectionn‚ ds liste textuelle: %d\n", no_selitem ); */
  1827.  
  1828.     while( count < no_selitem && curr_voie != NULL )
  1829.     {
  1830.         last_ptr_tonext = &(curr_voie -> next);
  1831.         curr_voie = curr_voie -> next;    /* Passe … la voie suivante */
  1832.         count++;
  1833.     }
  1834.  
  1835.     if( curr_voie == NULL )
  1836.         ping();                        /* Erreur interne! */
  1837.     else
  1838.     {    /*
  1839.          *    Suppression de la voie concern‚e:
  1840.          */
  1841.         /* printf( "No de la voie … supprimer: %d\n", curr_voie -> no_voie ); */
  1842.  
  1843.         *last_ptr_tonext = curr_voie -> next;    /* Lie voie pr‚c‚dente … voie suivante */
  1844.         
  1845.         FREE( curr_voie );        /* Cette voie n'est plus ds la liste, on peut l'effacer */
  1846.         
  1847.         /*
  1848.          * Supression de la ligne correspondante ds liste textuelle:
  1849.          */
  1850.         /* printf( "Supprime l'entr‚e [%s] de la liste textuelle\n", select_array[ no_selitem ] ); */
  1851.  
  1852.         FREE( select_array[ no_selitem ] );    /* Supprime texte de la ligne */
  1853.  
  1854.         nb_items--;                            /* 1 elt de moins */
  1855.         (list_handles -> nb_items) --;
  1856.  
  1857.         /*
  1858.          * D‚cale fin de la liste:
  1859.          */
  1860.         if ( no_selitem < nb_items )
  1861.         {    /* 
  1862.              * S'il y a qque chose … d‚caler: 
  1863.              */
  1864.             memcpy( &select_array[ no_selitem ], &select_array[ no_selitem +1 ],
  1865.                         (nb_items - no_selitem) * sizeof( char * ) );
  1866.         }
  1867.  
  1868.         /*
  1869.          * Reduit la m‚moire oqp par liste: 
  1870.          */
  1871.         *(list_handles -> pTpsz_array) = 
  1872.             (char * *) REALLOC( *(list_handles -> pTpsz_array), 
  1873.                                         nb_items * sizeof( char * ) );
  1874.         
  1875.         /* 
  1876.          * Il n'y a plus de ligne s‚lectionn‚e: 
  1877.          */
  1878.         list_handles -> selected_line = NIL;
  1879.  
  1880.  
  1881.         /*
  1882.          * Contr“le si on a cr‚‚ une ligne blanche … l'‚cran: 
  1883.          */
  1884.         if ( nb_items <= list_handles -> top_item + list_handles -> last_name - list_handles -> first_name)
  1885.         {    
  1886.             if ( list_handles -> top_item > 0 )
  1887.             {    /*
  1888.                 * On est pas en haut de la liste:
  1889.                 * On va la descendre pour combler la ligne blanche:
  1890.                 */
  1891.                 list_handles -> top_item --;
  1892.             }
  1893.             else
  1894.             {    /*
  1895.                  * Il y a - de lignes ds liste que physiquement affich‚es:
  1896.                  * On vide la ligne juste aprŠs la (nouvelle) derniŠre
  1897.                  * De plus, on la d‚s‚lectionne au cas o— c'‚tait celle qui ‚tait s‚lectionn‚e:
  1898.                  */
  1899.                 OBJECT *object_ptr = &(list_handles -> form_tree[ list_handles -> first_name + nb_items ]); 
  1900.                  
  1901.                 dlink_teptext( object_ptr, G_empty_string );        
  1902.                 objc_clrsel( object_ptr, 0 );                
  1903.             }
  1904.         }
  1905.     }
  1906. }
  1907.